package br.edu.delta.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.edu.delta.exception.NegocioException;
import br.edu.delta.form.EmprestimoForm;
import br.edu.delta.model.Emprestimo;
import br.edu.delta.model.Leitor;
import br.edu.delta.model.Livro;
import br.edu.delta.service.DevolucaoService;
import br.edu.delta.service.EmprestimoService;
import br.edu.delta.util.Util;

/**
 * <p>
 * <b>Title:</b> EmprestimoController
 * </p>
 * 
 * <p>
 * <b>Description:</b> EmprestimoController
 * </p>
 * 
 * <p>
 * <b>Company: </b>
 * </p>
 * 
 * @author Denis
 * 
 * @version 1.0.0
 */
@Named
@RequestScoped
public class EmprestimoController extends AppController {

	private static final String PAGINA_EMPRESTIMO_INICIO = "/paginas/emprestimo/inicio";

	/** Atributo serialVersionUID. */
	private static final long serialVersionUID = -1L;

	/** Atributo ATIVADO_COM_SUCESSO. */
	private static final String REALIZADO_COM_SUCESSO = "Emprestimo realizado com sucesso!";

	/** Atributo service. */
	@Inject
	private EmprestimoService service;
	
	/** Atributo service. */
	@Inject
	private DevolucaoService devolucaoService;

	/** Atributo formulario. */
	@Inject
	private EmprestimoForm formulario;

	/**
	 * @see br.edu.delta.controller.AppController#iniciarDados()
	 */
	@Override
	public void iniciarDados() {

		this.getFormulario().setEntidade(new Emprestimo());
		
		this.getFormulario().setLivro(new Livro());
	}

	/**
	 * Método responsável por retornar lista de nomes de leitores
	 * 
	 * @author Denis
	 * 
	 * @param nome
	 * @return
	 */
	public Collection<String> pesquisarLeitores(String nome) {

		return this.getService().pesquisarLeitores(nome);
	}

	/**
	 * Método responsável por pesquisar leitor por id
	 * 
	 * @author Denis
	 * 
	 */
	public void pesquisarLeitorPorId() {
		
		Leitor leitor = this.getService().pesquisarLeitorPorId(this.getFormulario().getEntidade().getLeitor().getId());

		this.getFormulario().getEntidade().setLeitor(new Leitor());

		if (!Util.isNull(leitor)) {

			this.getFormulario().getEntidade().setLeitor(leitor);
			
			//obtem o ultimo emprestimo realizado pelo leitor
			Emprestimo emprestimo = this.getService().obterEmprestimo(leitor);
			
			//retorna verdadeiro se o emprestimo possue livros pendentes de devolucao
			if(!Util.isNullOuVazio(emprestimo) && this.getDevolucaoService().isPossueLivroPendentesDevolucao(emprestimo)){
				AppController.messageWarn("Leitor \"" + leitor.getNome().toUpperCase() + "\" com livro(s) pendente de devolução!");
				this.getFormulario().getEntidade().setLeitor(new Leitor());
			}
			
		} else {

			this.getFormulario().getEntidade().setLeitor(new Leitor());

			AppController.messageError("Leitor não Encontrado!");
		}
	}

	/**
	 * Método responsável por pesquisar leitor por nome
	 * 
	 * @author Denis
	 * 
	 */
	public void pesquisarLeitorPorNome() {

		Leitor leitor = this.getService().pesquisarLeitorPorNome(this.getFormulario().getEntidade().getLeitor().getNome());

		this.getFormulario().getEntidade().setLeitor(new Leitor());

		if (!Util.isNull(leitor)) {

			this.getFormulario().getEntidade().setLeitor(leitor);
		} else {

			this.getFormulario().getEntidade().setLeitor(new Leitor());
			AppController.messageError("Leitor não Encontrado!");
		}
	}

	/**
	 * Método responsável por pesquisar livros por código
	 * 
	 * @author Denis
	 * 
	 */
	public void pesquisarLivroPorCodigo() {

		Livro livro = this.getService().pesquisarLivroPorCodigo(this.getFormulario().getLivro().getCodigo());

		this.getFormulario().setLivro(new Livro());

		if (!Util.isNull(livro)) {

			this.getFormulario().setLivro(livro);
		} else {

			this.getFormulario().setLivro(new Livro());

			AppController.messageError("Livro não Encontrado!");
		}
	}

	/**
	 * Método responsável por retornar lista de nomes de livros
	 * 
	 * @author Denis
	 * 
	 * @param nome
	 * @return
	 */
	public Collection<String> pesquisarLivros(String nome) {

		return this.getService().pesquisarLivros(nome);
	}

	public void adicionarLivro() {
		
		if(this.getFormulario().getEntidade().getLivros().size() == this.getService().qtdMaximaItensEmprestar()){
			
			AppController.messageWarn("Já Atingiu a quantidade Máxima de Livros Adicionados!");
			
		} else if (Util.isNull(this.getFormulario().getLivro().getId())) {

			AppController.messageWarn("Selecione um Livro para ser Adicionado!");
			
		} else if(this.getFormulario().getEntidade().getLivros().contains(this.getFormulario().getLivro())){
			
			AppController.messageWarn("O Livro Selecione já está na Lista!");
			
		} else {

			this.getFormulario().getEntidade().getLivros().add(this.getFormulario().getLivro());

			this.getFormulario().setLivro(new Livro());

			AppController.messageInfo("Livro Adicionado com Sucesso!");
		}
	}

	public void removerLivroAdicionado() {

		this.getFormulario().getEntidade().getLivros().remove(this.getFormulario().getLivro());

		this.getFormulario().setLivro(new Livro());

		AppController.messageInfo("Livro Removido com Sucesso!");
	}

	/**
	 * Método responsável por pesquisar livro por nome
	 * 
	 * @author Denis
	 * 
	 */
	public void pesquisarLivroPorNome() {

		Livro livro = this.getService().pesquisarLivroPorNome(this.getFormulario().getLivro().getNome());

		this.getFormulario().setLivro(new Livro());

		if (!Util.isNull(livro)) {

			this.getFormulario().setLivro(livro);
		} else {

			this.getFormulario().setLivro(new Livro());

			AppController.messageError("Livro não Encontrado!");
		}
	}

	/**
	 * Método responsável por preparar cadastro
	 * 
	 * @author Denis
	 * 
	 */
	public void prepararCadastro() {

		if (this.getFormulario().getEntidade().getId() == null) {

			this.getFormulario().setEntidade(new Emprestimo());
		}
	}
	
	public boolean isListaLivrosSelecioadaEmpty(){
		return this.getFormulario().getEntidade().getLivros().isEmpty();
	}
	
	public List<Livro> obterListaLivrosSelecionados(){
		
		List<Livro> livros = new ArrayList<>();
		
		for (Livro livro : this.getFormulario().getEntidade().getLivros()) {
			livros.add(livro);
		}
		
		return livros;
	}

	/**
	 * Método responsável realizar o emprestimo
	 * 
	 * @author Denis
	 * 
	 * @return
	 */
	public String salvarEmprestimo() {

		if (regrasValidacaoCampos()) {

			return null;
		} else {

			try {

				this.getFormulario().getEntidade().setDataMaximaDevolucao(this.getFormulario().getDataDevolucao());

				this.getService().salvar(this.getFormulario().getEntidade());

				this.iniciarDados();

				AppController.messageInfo(EmprestimoController.REALIZADO_COM_SUCESSO);

				return PAGINA_EMPRESTIMO_INICIO;

			} catch (final NegocioException e) {

				AppController.messageError(e.getMessage());

				return null;
			}

		}
	}

	private boolean regrasValidacaoCampos() {

		boolean validar = false;

		if (Util.isNull(this.getFormulario().getEntidade().getLeitor().getId())) {
			AppController.messageWarn("Selecione um Leitor!");
			validar = true;
		}

		if (this.getFormulario().getEntidade().getLivros().isEmpty()) {
			AppController.messageWarn("Selecione no mínimo um Livro!!");
			validar = true;
		}

		return validar;
	}

	/**
	 * Retorna o valor do atributo <code>service</code>
	 * 
	 * @return <code>EmprestimoService</code>
	 */
	public EmprestimoService getService() {

		return service;
	}

	/**
	 * Retorna o valor do atributo <code>formulario</code>
	 * 
	 * @return <code>EmprestimoForm</code>
	 */
	public EmprestimoForm getFormulario() {

		return formulario;
	}

	
	/**
	 * Retorna o valor do atributo <code>devolucaoService</code>
	 *
	 * @return <code>DevolucaoService</code>
	 */
	public DevolucaoService getDevolucaoService() {
	
		return devolucaoService;
	}

	
}
